home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 7: Sunsite
/
Linux Cubed Series 7 - Sunsite Vol 1.iso
/
system
/
admin
/
linuxcon.000
/
linuxcon
/
linuxconf-1.6
/
netconf
/
ifconfig.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-05
|
2KB
|
76 lines
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <string.h>
#include "netconf.h"
static int ifconfig_ioctl(
int fd,
const char *ifname,
int cmd,
struct ifreq &ifr)
{
strcpy(ifr.ifr_name, ifname);
return ioctl(fd, cmd,&ifr);
}
static void ifconfig_format (struct sockaddr &adr, char *buf)
{
struct sockaddr_in *sin = (struct sockaddr_in*)&adr;
devices_ip2a (htonl(sin->sin_addr.s_addr),buf);
}
/*
Fetch the inteface configuration from the kernel.
Return -1 if any error.
*/
int ifconfig_getinfo (
const char *ifname,
IFCONFIG_INFO &info)
{
int ret = -1;
int skfd = socket(AF_INET, SOCK_DGRAM, 0);
memset (&info,0,sizeof(IFCONFIG_INFO));
if (skfd != -1){
struct ifreq ifr;
if (ifconfig_ioctl(skfd, ifname, SIOCGIFFLAGS, ifr) >= 0){
info.flags = ifr.ifr_flags;
if (ifconfig_ioctl(skfd,ifname,SIOCGIFADDR, ifr) >= 0){
ifconfig_format (ifr.ifr_addr,info.ip_addr);
if (ifconfig_ioctl(skfd,ifname, SIOCGIFDSTADDR, ifr) >= 0) {
ifconfig_format (ifr.ifr_dstaddr,info.dst_addr);
if (ifconfig_ioctl(skfd, ifname,SIOCGIFNETMASK, ifr) >= 0) {
ifconfig_format (ifr.ifr_netmask,info.netmask);
ret = 0;
}
}
}
}
}
return ret;
}
#ifdef TEST
int main (int, char *argv[])
{
IFCONFIG_INFO info;
if (ifconfig_getinfo(argv[1],info) == -1){
fprintf (stderr,"No info on network device %s\n",argv[1]);
}else{
printf ("Network devices %s\n",argv[1]);
printf ("flags : %04x\n",info.flags);
printf ("addr : %s\n",info.ip_addr);
printf ("dst addr : %s\n",info.dst_addr);
printf ("netmask : %s\n",info.netmask);
}
return 0;
}
#endif